package kr.co.boogui.controller;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet(name="MVCControllerSetup", initParams={@WebInitParam(name="mvcCfg", value="/WEB-INF/mvc.properties")})
public class MVCControllerSetup extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	// 요청처리에 사용하는 action 클래스들을 키와 이름형태로 Map 자료구조에 저장
	private static Map<String, Object> actionsMap = new HashMap<>();
	
	// action 클래스들이 저장된 Map을 반환함
	public static Map<String, Object> getActionsMap(){return actionsMap;} 

	// 요청URI와 그것과 관련있는 action 클래스를 연결시켜 Map에 저장해둠
	public void init(ServletConfig cfg) throws ServletException {
		
		// 요청 URI와 이것과 관련있는 action 클래스들을 외부파일에 저장해 두었는데,
		// MVC 초기 작업을 위해 이것을 메모리로 불러와야 함
		// 서블릿 초기화 매개변수를 이용해서 읽어들일 외부 설정파일을 지정함
		String mvcCfg = cfg.getInitParameter("mvcCfg");
		
		// 읽어 들인 파일은 키=값 형태로 메모리 상에 저장해두기 위해 Properties 클래스를 선언함 
		Properties p = new Properties();
		
		// 파일에 저장된 내용을 읽기 위해 FileInputStream 클래스를 선언함
		FileInputStream fis = null;
		
		try {
			// 지정된 경로에 있는 설정파일의 내용을
			String cfgPath = cfg.getServletContext().getRealPath(mvcCfg);
			// 메모리로 읽어들여
			fis = new FileInputStream(cfgPath);
			// 키=값 형태로 메모리상에 따로 저장해 둠
			p.load(fis);
		} catch (Exception ex) {
			ex.printStackTrace();
		} finally {
			if(fis!=null)try{fis.close();}catch(Exception e){}
		}
		
		// 메모리에 저장된 키=값 객체들을 조회하기 쉽도록 Iterator 클래스로 재구성함
		Iterator<Object> iter = p.keySet().iterator();
		
		// Iterator 객체에 저장된 정보들을		
		while(iter.hasNext()) {
			// 순차적으로 하나씩 꺼낸 후
			String cmd = (String)iter.next();
			// Properties중 '값'을 이용해서			
			String actionClassName = p.getProperty(cmd);
			
			try {
				// action 클래스에 대한 객체를 동적으로 생성하고				
				Class<?> actionClass = Class.forName(actionClassName);
				Object actionInstance = actionClass.newInstance();
				// 이 객체에 대한 이름을 Properties중 '키'로 지정
				actionsMap.put(cmd, actionInstance);
			} catch (Exception ex) {
				ex.printStackTrace();
			} // try
		} // while
	}

}
